#include <vector>

template<class T>
class CircleQueue //循环队列
{
public:
    //初始化vector，队头队尾指针指向0
    CircleQueue(int num)
        :_cap(num+1)
        ,_avail(num)
        ,_cq(std::vector<T>(_cap))
        , _front(0)
        , _back(0)
    {}

    bool push(const T& data)
    {
        if (full()) return false;

        _cq[_back] = data;
        _back = (_back + 1) % _cap;
        return true;
    }

    bool pop()
    {
        if (empty()) return false;

        _front = (_front + 1) % _cap;
        return true;
    }

    T front()
    {
        if(empty()) return T();
        return _cq[_front];
    }

    bool empty() { return _front == _back; } //判空
    bool full() { return (_back + 1) % _cap == _front; } //判满
    
    size_t size() { return (((_back - _front) + _cap) % _cap); }

private:
    size_t _cap; //实际空间大小
    size_t _avail; //可用空间大小

    std::vector<T> _cq;
    size_t _front; //队头指针
    size_t _back; //队尾指针

};